Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Что лучше "prepare+execute" или "query" для "одноразовых запросов"? (Mandor)
Author Message
Mandor
Заглянувший



Joined: 20 Jul 2006
Posts: 4
Карма: 0
   поощрить/наказать


PostPosted: Thu Jul 20, 2006 10:58 am (написано за 22 минуты 34 секунды)
   Post subject: Что лучше "prepare+execute" или "query" для "одноразовых запросов"?
Reply with quote

Хотел бы задать разбирающимся людям несколько вопросов касательно различия конструкций prepare+execute и query. В случае, когда один запрос может быть вызван несколько раз за соединение с разными параметрами - все понятно, меня интересует случай "одноразового" запроса (когда запрос исполняется только один раз за соединение). (Если это имеет значение, то интересует библиотека PDO)

1. Имеет ли смысл использовать prepare+execute, то есть не будет ли это менее эффективно, чем простой query? Вообще, какой из вариантов более эффективен? С одной стороны в prepare+execute больше операций, с другой, мне кажется, prepare может вполне выполняться параллельно на сервере БД, пока php устанавливает значения.

2. Если один и тот же запрос подготавливать при каждом его вызове то будет ли БД сервер использовать ранее "откомпилированную" версию запроса или перекомпилировать постоянно (в пределах одного соединения разумеется) (вариант prepare+execute+prepare+execute, про prepare+execute+execute все ясно)?

3. Если используются persistent connections (не будем здесь рассматривать вопрос о целесообразности их использования) то будут ли такие "одноразовые" запросы откомпилированы только один раз или же при каждом вызове скрипта? (Пока писал понял, что БД сервер не различает вызовы скрипта, а так как соединение всегда одно, то наверняка будет выгода.)

4. Вообще какую часть времени от общего исполнения запроса съедает prepare и какую execute, примерно? Например, простой SELECT * FROM table WHERE a=1, где a - первичный ключ, формат таблицы фиксированный. Извиняюсь, что не проверяю сам, а спрашиваю, т.к. не уверен что смогу получить достоверные результаты без учета всяких кэшей.

5. Бывает вид запроса зависит от его параметров, например, в случае использования INSERT со вставкой нескольких строк. Мы не можем сделать prepare('INSERT INTO table VALUES (...),(...),(...)') т.к. не знаем заранее количество этих самых (...) (т.е. сколько строк мы будем вставлять), это мы узнаем на следующем этапе, когда будем присваивать параметры. Присвоить параметры до prepare мы тоже не можем. Получается мы должны сначала пройтись по массиву параметров и сделать подходящий prepare с нужным количеством строк, потом еще раз пройтись по массиву и присвоить значения параметрам. Очевидно что получается, во-первых: куча накладных расходов, во-вторых: запрос хоть и будет подготовлен, но во второй раз использован не будет, т.к. количество вставляемых строк в новом запросе будет другим (т.е. и запрос другой). Может тогда такие запросы выполнять через простой query (правда тогда придется применять quote к параметрам, хотя в документации к PDO::quote() настоятельно рекомендуется делать этой через prepare)? Вариант разбиения такого INSERT'а на несколько однострочных я вообще не рассматриваю (может зря?).

Заранее благодарю за ответы.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Nov 08, 2006 11:50 am (спустя 3 месяца 19 дней 51 минуту; написано за 2 минуты 57 секунд)
   Post subject:
Reply with quote

1. Я замеров не проводил, но думаю, что скорость одинаковая, т.к. query сам делает prepare+execute. Надо смотреть исходники соответствующих функций PHP.
2. Вот это зависит от сервера. Лично мне кажется - вряд ли будет.
4. Prepare обычно очень быстр. Т.к. в типовых скриптах не должно быть больше 20-30 запросов к базе (если больше, серьезный способ задуматься, нет ли ошибок в архитектуре), то его временем можно пренебречь.
5. Такой insert с несколькими скобками, если не ошибаюсь, не удовлетворяет стандартам. Чистая специфика MySQL. А поддерживает ли вообще MySQL операцию prepare на низком уровне? У меня есть основания предполагать, что не поддерживает (т.е. для нее prepare - пустышка, которая просто сохраняет скелет запроса).
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML